/**
 * TDS PEC 4
 * Grupo 3H2M
 *
 * El paquete <code>edu.uoc.tds.pec4.mantenimiento</code> agrupa todas las
 * interfaces, clases y elementos de la GUI para la gestión del subsistema 
 * de Mantenimiento
 */
package edu.uoc.tds.pec4.mantenimiento;

import edu.uoc.tds.pec4.rmi.GestorMantenimientoInterface;
import edu.uoc.tds.pec4.beans.CiudadDTO;
import edu.uoc.tds.pec4.beans.PaisDTO;
import edu.uoc.tds.pec4.beans.ProvinciaDTO;
import edu.uoc.tds.pec4.beans.UsuarioDTO;
import edu.uoc.tds.pec4.rmi.GestorDiccionarioInterface;
import edu.uoc.tds.pec4.common.util.TDSLanguageUtils;
import edu.uoc.tds.pec4.common.util.UtilidadesGUI;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorDiccionarioException;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * La clase <code>DialogLocalidad</code> representa la interfaz de
 * usuario para la consulta de paises, provincias y ciudades.<br />
 *
 * Interficie de usuario para la consulta de localidades, provincias y paises
 *
 * @author	Luis Rivas Mariño
 * @version	10/12/2011
 * @see		edu.uoc.tds.pec4.rmi.GestorMantenimientoInterface
 */
public class DialogLocalidad extends JDialog {

    private JComboBox cbCiudad;
    private JComboBox cbPais;
    private JComboBox cbProvincia;
    private JLabel lblCiudad;
    private JLabel lblPais;
    private JLabel lblProvincia;
    private JPanel panelBuscarCiudad;
    private JButton btnVolver;
    
    /** clientConnected Indica si el cliente está conectado al servidor */
    private boolean clientConnected = false;
    /** objRemoto es el objeto empleado como interfaz en la comunicación RMI */
    private GestorDiccionarioInterface objRemotoDic = null;
    private GestorMantenimientoInterface objRemotoMantenimiento = null;
    private String idUsuario;
    private final String idConectado;

    /** Creates new form DialogLocalidad */
    public DialogLocalidad(Frame frame, boolean modal, UsuarioDTO usLogeado) {

        super(frame, TDSLanguageUtils.getMessage("mantenimiento.usuario.buscaciudad.titulo"), modal);

        conectarCliente();

        inicializaComponentes();

        // Obtenemos el id del usuario 
        idConectado = usLogeado.getIdUsuario();

        //Centramos la ventana en la pantalla
        UtilidadesGUI.centrarVentana(this);
    }

    /**
     * Conectar con el servidor RMI de paises
     * Permitela conexion con el servidor RMI
     */
    private void conectarCliente() {
        try {
            objRemotoDic = (GestorDiccionarioInterface) Naming.lookup("GestorDiccionario");
            objRemotoMantenimiento = (GestorMantenimientoInterface) Naming.lookup("GestorMantenimiento");
            clientConnected = true;
        } catch (NotBoundException eNbe) {
            objRemotoDic = null;
            objRemotoMantenimiento = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.notbound") + "\n" + eNbe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            objRemotoDic = null;
            objRemotoMantenimiento = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.url") + "\n" + eRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (MalformedURLException eMULRe) {
            objRemotoDic = null;
            objRemotoMantenimiento = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eMULRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            objRemotoDic = null;
            objRemotoMantenimiento = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eE.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Este método inicializa el desplegable de paises
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getCbPais() {
        if (cbPais == null) {
            try {
                List<PaisDTO> paises = objRemotoDic.listaPaises();
                cbPais = new JComboBox(paises.toArray());
                cbPais.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        cbPaisActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.pais"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.pais"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return cbPais;
    }

    /**
     * Este método inicializa el desplegable de las provincias 
     * del país seleccionado
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getCbProvincia() {
        if (cbProvincia == null) {
            try {
                int idPais = ((PaisDTO) cbPais.getSelectedItem()).getIdPais();
                List<ProvinciaDTO> provincias = objRemotoDic.listaProvincias(idPais);
                cbProvincia = new JComboBox(provincias.toArray());
                cbProvincia.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        cbProvinciaActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return cbProvincia;
    }

    /**
     * Este método inicializa el desplegable de las ciudades 
     * de la provincia seleccionada
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getCbCiudad() {
        if (cbCiudad == null) {
            try {
                int idProvincia = ((ProvinciaDTO) cbProvincia.getSelectedItem()).getIdProvincia();
                List<CiudadDTO> ciudades = objRemotoDic.listaCiudades(idProvincia);
                cbCiudad = new JComboBox(ciudades.toArray());
                cbCiudad.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        cbCiudadActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return cbCiudad;
    }

    /**
     * Método que maneja el evento sobre el cambio de opción en el desplegable de
     * paises.<br />
     * Provoca el refresco de provincias en el desplegable de provincias, mostrando
     * sólo aquellas que corresponden con el país indicado por el desplegable.<br />
     *
     * Invoca al manejador del desplegable de ciudades para también mostrar las
     * ciiudades vinculadas a la primera provincia seleccionada.
     */
    private void cbPaisActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            // Recuperamos el pais seleccionado
            int idPais = ((PaisDTO) cbPais.getSelectedItem()).getIdPais();

            List<ProvinciaDTO> provincias = objRemotoDic.listaProvincias(idPais);
            cbProvincia.removeAllItems();

            for (ProvinciaDTO inc : provincias) {
                cbProvincia.addItem(inc);
            }

            // Cargamos el combo de ciudades
            cbProvinciaActionPerformed(null);

        } catch (GestorDiccionarioException giE) {
            JOptionPane.showMessageDialog(null,
                    giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                    ex.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

     /**
     * Método que maneja el evento sobre el cambio de opción en el desplegable de
     * provincias.<br />
     * Provoca el refresco de ciudades en el desplegable de ciudades, mostrando
     * sólo aquellas que corresponden con la provincia indicada por el desplegable.<br />
     *
     * Invoca al manejador del desplegable de ciudades para también mostrar las
     * ciiudades vinculadas a la primera provincia seleccionada.
     */
    private void cbProvinciaActionPerformed(java.awt.event.ActionEvent evt) {

        if (cbProvincia.getSelectedItem() == null) {
            return;
        }

        try {
            // Recuperamos la provincia seleccionado
            int idProvincia = ((ProvinciaDTO) cbProvincia.getSelectedItem()).getIdProvincia();
            List<CiudadDTO> ciudades = objRemotoDic.listaCiudades(idProvincia);
            cbCiudad.removeAllItems();

            for (CiudadDTO inc : ciudades) {
                cbCiudad.addItem(inc);
            }

        } catch (GestorDiccionarioException giE) {
            JOptionPane.showMessageDialog(null,
                    giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

   /**
     * Cierra el cuadro de diálogo de búsqueda de ciudad
     */
    private void cbCiudadActionPerformed(ActionEvent e) {
        setVisible(false);
        dispose();
    }

    /**
     * Método que permite devolver la ciudad seleccionada
     */
    public CiudadDTO getCiudad() {
        return ((CiudadDTO) cbCiudad.getSelectedItem());
    }
    
    private void inicializaComponentes() {

        panelBuscarCiudad = new javax.swing.JPanel();
        lblPais = new javax.swing.JLabel();
        lblProvincia = new javax.swing.JLabel();
        lblCiudad = new javax.swing.JLabel();
        cbPais = getCbPais();
        cbProvincia = getCbProvincia();
        cbCiudad = new javax.swing.JComboBox();
        
        cbCiudad.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                cbCiudadMouseClicked(evt);
            }
        });

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        panelBuscarCiudad.setBorder(javax.swing.BorderFactory.createTitledBorder("Selector de localidad"));

        lblPais.setText("País: ");

        lblProvincia.setText("Provincia: ");

        lblCiudad.setText("Localidad: ");

        javax.swing.GroupLayout panelBuscarCiudadLayout = new javax.swing.GroupLayout(panelBuscarCiudad);
        panelBuscarCiudad.setLayout(panelBuscarCiudadLayout);
        panelBuscarCiudadLayout.setHorizontalGroup(
            panelBuscarCiudadLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBuscarCiudadLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelBuscarCiudadLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblProvincia)
                    .addComponent(lblPais)
                    .addComponent(lblCiudad))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelBuscarCiudadLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(cbCiudad, 0, 180, Short.MAX_VALUE)
                    .addComponent(cbPais, 0, 180, Short.MAX_VALUE)
                    .addComponent(cbProvincia, 0, 180, Short.MAX_VALUE))
                .addContainerGap())
        );
        panelBuscarCiudadLayout.setVerticalGroup(
            panelBuscarCiudadLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBuscarCiudadLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelBuscarCiudadLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblPais)
                    .addComponent(cbPais, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelBuscarCiudadLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblProvincia)
                    .addComponent(cbProvincia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelBuscarCiudadLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCiudad)
                    .addComponent(cbCiudad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelBuscarCiudad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(22, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(panelBuscarCiudad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }
    
    private void cbCiudadMouseClicked(java.awt.event.MouseEvent evt) {
            dispose();
    }
}
